<?php
/**
 * Created by JetBrains PhpStorm.
 * User: Андрей
 * Date: 11.05.12
 * Time: 0:26
 * To change this template use File | Settings | File Templates.
 */

    /*
     * Мэппер для модели Юзер
     */

    class UserModelMapper extends DAOBaseAbstract
    {
        // дополнительное имя таблицы
        // чтобы вытаскивать из нее информацию
        // для юзера
        protected $_tableNameOptional;

        public function __construct()
        {
            parent::__construct();

            $this->_tableName = 'users';
            $this->_tableNameOptional = 'usersinfo';
            $this->_primaryKey = 'Id';
        }

        /*
         * Проверить доступность логина для регистрации
         */
        public function isLoginFree(UserModel $user)
        {
            $res = $this->select($user->getLogin(), 'login');
            // если нет совпадений
            if (!$res)
                return true; // свободно
            else
                return false; // занято
        }

        /*
         * Проверить существование пользователя
         * пример: переход на страничку несуществующего пользователя
         * userProfile=dsfjksd
         * Проверка осуществляется по Id сначала, если он установлен
         * Затем по Логину
         */
        
        public function isUserExists(UserModel $user)
        {
            // добавить id, если его нет
            $this->correctBaseInfo($user);

            $res = $this->select($user->getId());

            // есть есть результат
            if ($res)
                return true;
            else
                return false;
        }

        /*
         * получить зарегестрированных пользователей
         */
        public function fetchAllUsers()
        {
            $query = "SELECT * FROM " . $this->_tableName;
            $users = array();
            // запрос
            if ( $res = $this->query($query) )
            {
                while($row = mysql_fetch_assoc($res))
                {
                    $user = new UserModel($row['Id'], $row['login']);
                    $users[] = $user;
                }

                return $users;
            }
        }
        
        /*
         *  Подправить основную информацию, допустим, если
         *  только логин или айди, сделать чтобы были оба
         */

        private function correctBaseInfo(UserModel $user)
        {
            // если не дано ни одно свойсто, то ошибка
            if ( ($user->getId()) == null && ($user->getLogin() == null) )
            {
                return false;
            }

            // если нет id
            if ( $user->getId() == null)
            {
                $res = $this->select($user->getLogin(), 'login');
                if ( !empty($res) )
                    $user->setId($res[0]['Id']);
            }

            if ( $user->getLogin() == null)
            {
                $res = $this->select($user->getId());
                if ( !empty($res) )
                    $user->setLogin($res[0]['login']);
            }

            return true;
        }
        

        /*
         * Зарегистрировать пользователя
         */

        public function register(UserModel $user)
        {
            // если доступно для регистрации
            if ( ! $this->isLoginFree($user) )
                return false;

            // вставитьд данные
            $res = $this->insert(
                array(
                    "login" => $user->getLogin(),
                    "passwordHash" => $user->getPasswordHash()
                )
            );

            // если ошибка вставки
            if (! $res)
                return false;

            // создать данные в доп. таблице

            $tmp = $this->_tableName;
            $this->_tableName = $this->_tableNameOptional;

            $this->insert(
                array(
                    "Id" => $this->lastInsertId()
                )
            );

            $this->_tableName = $tmp;

            return true;
        }

        /*
         * Авторизовать пользователя
         */
        public function authorize(UserModel $user)
        {
            // выбрать данные
            if ( !$this->isUserExists($user) )
                return false;
            
            $res = $this->select($user->getLogin(), 'login');

            if (!$res) return false;

            $passHash = $res[0]['passwordHash'];

            // если пароли совпадают
            if ($passHash == $user->getPasswordHash())
            {
                $user->setId($res[0]['Id']);
                $this->fetchUserInfo($user);
                // сохранить данные пользователя авторизованного
                // в хранилище (в данном случае сессия)
                self::saveCurrentUser($user);
                return true;
            } else{
                return false;
            }
            
        }

        /*
         * Получить всю инфомрацию о пользователе
         * логин, имя, фамилия, id и.т.д.
         * входным параметром должны быть id или логин
         * или оба =)
         */

        public function fetchUserInfo(UserModel & $user)
        {
            // Если получать информацию авторизованного пользователя
            /*
            $curUser = self::getCurrentUser();
            if ( $curUser )
            {
                if ( ($curUser->getLogin() == $user->getLogin()) & )
                {
                    $user =  $curUser;
                    return true;
                }
            }
            */

            
            // если не существует пользователя
            // то вытаскивать нечего
            if ( !$this->isUserExists($user) )
                return false;
                        
            // если нету Id, прим. получаем только по логину
            $this->correctBaseInfo($user);

            // поменять таблицу для выборки
            // т.к. доп.информация лежит в другой
            $tmp = $this->_tableName;
            $this->_tableName = $this->_tableNameOptional;

            // запрос
            $res = $this->select($user->getId(), 'Id');
            
            // вернуть все на место
            $this->_tableName = $tmp;

            // если ошибка запроса
            if (!$res)
                return false;
            
            // такая штука во многих местах
            // так как возвращается массив rows
            $res = $res[0];

            // вписать даныне полученные
            $user->setName($res['name'])
                 ->setSurname($res['surname'])
                 ->setBackImage($res['backImage'])
                 ->setMotto($res['motto'])
                 ->setKarma($res['karma'])
                 ->setPhoto($res['photo']);

            // все хорошо
            return true;
        }

        /*
         * Получить текущего авторизованного пользователя
         */
        public static function getCurrentUser()
        {
            if ( !session_id() ) session_start();

            $user = new UserModel();

            if ( ! isset($_SESSION['userAuthorized']) )
            {
                return $user;
            }

            $user->setId( $_SESSION['userId'] )
                  ->setLogin( $_SESSION['userLogin'] )
                  ->setName( $_SESSION['userName'])
                  ->setSurname( $_SESSION['userSurname'] )
                  ->setPhoto( $_SESSION['userPhoto'] )
                  ->setBackImage( $_SESSION['userBackImage'])
                  ->setMotto( $_SESSION['userMotto'])
                  ->setKarma( $_SESSION['userKarma']);

            return $user;
        }

        /*
         * Сохранить данные в сессии
         */

        public static function saveCurrentUser(UserModel $user)
        {
            if ( !session_id() ) session_start();

            if ( isset($_SESSION['userAuthorized']) )
                return false;
            
            $_SESSION['userId'] = $user->getId();
            $_SESSION['userLogin'] = $user->getLogin();
            $_SESSION['userName'] = $user->getName();
            $_SESSION['userSurname'] = $user->getSurname();
            $_SESSION['userPhoto'] = $user->getPhoto();
            $_SESSION['userBackImage'] = $user->getBackImage();
            $_SESSION['userMotto'] = $user->getMotto();
            $_SESSION['userKarma'] = $user->getKarma();

            $_SESSION['userAuthorized'] = true;

            return true;
        }

        /*
         * Удалить данные сеанса юзера
         */

        public static function logout()
        {
            // удалить куки связанные с сессией
             if ( ini_get("session.use_cookies") )
             {
                $params = session_get_cookie_params();
                setcookie(session_name(), '', time() - 42000,
                          $params["path"], $params["domain"],
                          $params["secure"], $params["httponly"]
                );

                // удалить данные сессии
                if ( session_destroy() )
                {
                    return TRUE;
                } else{
                    return FALSE;
                }
             }
        }


        /*
         * Изменнить данные пользователя
         */
        public function saveSettings(UserModel $user)
        {
            
        }
        
    }
